class AbstractDrop:
    """ Class - or rather interface? - that is meant to be inherited from while
        creating new drops. Any drop object, having inherited from AbstractDrop,
        will pass isinstance() tests. By implementing all class methods from 
        AbstractDrop, all drop objects will have similar interfaces (this reason
        seems to be more pythonic and OO.)
        
        Basically, all objects deriving from AbstractDrop should be able to be
        picked up and placed in inventory. In simple words:
        wanna create some new drop? -> implement all methods and attribs!
        
        Each attrib shall have 'getter' and 'setter' defined. In order to manipulate
        attribs, use those methods instead of interacting directly (unless in constructor).
        
        attribs:
        _itemName - name of item (like 'teeth of stuttering knight')
        _itemQuantity - quantity of items that are dropped
            Atm, this params collide a bit with inventory's item count!
        _itemType - type of item ('weapon', 'plant' etc.);
             not sure if will be used or not, hence the underline
        _equip - shall be considered a boolean type, an information whether
            the item is equippable or not (to avoid equipping cakes or such...)
        _model - model loaded from file
        _modelFilePath - path to model's files. Handy.
        _collisionSolid - collision solid defined in order to get collisions; shapes
            may be different for different objects
        
    """
    
    _itemName = 'Not yet implemented'
    
    _positionX = None
    
    _positionY = None
    
    _positionZ = None
    
    _itemQuantity = -500
    
    _itemType = 'Not yet implemented'
    
    _equip = False
    
    _model = None
    
    _modelFilePath = 'Not yet implemented'
    
    _collisionSolid = None
    
    
####### You don't actually need item's name here - it's const within each derived class!
    def __init__(self, x, y, z, itemQuantity):
        self._positionX = x
        self._positionY = y
        self._positionZ = z
        self._itemQuantity = itemQuantity
        
    def getItemName(self):
        return self._itemName
    
    def setItemName(self, sNewItemName):
        self._itemName = sNewItemName
        
    def getItemQuantity(self):
        return self._itemQuantity
    
    def setItemQuantity(self, iNewQuantity):
        self._itemQuantity = iNewQuantity
        
    def getItemType(self):
        return self._itemType
    
    def setItemType(self, sNewType):
        self._itemType = sNewType
        
    def getEquip(self):
        return self._equip
    
    def setEquip(self, bEquip):
        self._equip = bEquip
        
    def getModel(self):
        return self._model
    
    def setModel(self, newModel):
        self._model = newModel
        
    def getModelFilePath(self):
        return self._modelFilePath
    
    def setModelFilePath(self, sNewPath):
        self._modelFilePath = sNewPath
        
    def getCollisionSolid(self):
        return self._collisionSolid
    
    def setCollisionSolid(self, newSolid):
        self._collisionSolid = newSolid
        
    def getX(self):
        return self._positionX
    
    def getY(self):
        return self._positionY
    
    def getZ(self):
        return self._positionZ
    
    